public class Hand 
{
	Card[] cards;
	
	Hand()
	{
		cards = new Card[4];
	}
	
	Hand(Card[] test)
	{
		cards = new Card[4];
		for(int i = 0; i < 4; i++)
			cards[i] = test[i];
	}
	public void setHand(Card[] test)
	{
		for(int i = 0; i < 4; i++)
			cards[i] = test[i];
	}
	
	public Card[] getHand()
	{
		return cards;
	}
	
	void sort()
	{
		int count = 4;
	
		do
		{
			for(int i = 0; i < count - 1; i++)
			if(cards[i].compareTo(cards[i + 1]) == 1)
			{
				Card temp = cards[i];
				cards[i] = cards[i + 1];
				cards[i + 1] = temp;
			}
			count--;
		}
		while(count > 1);
	}
	
	public int getNumberOfCard()
	{
		Card[] temp;
		temp = choiceSet(cards);
		return getQuantityCards(temp);
	}
	
	public Card getCard(int index) //zwraca karte
	{
		return cards[index];
	}
	
	public int getValueCard(int i)
	{
		return cards[i].getNumber();
	}
	
	private static Card[] sortBack(Card[] test)
	{
		int count = test.length;
	
		do
		{
			for(int i = 0; i < count - 1; i++)
				if(test[i].compareTo(test[i + 1]) < 0)
				{
					Card temp = test[i];
					test[i] = test[i + 1];
					test[i + 1] = temp;
				}
			
			count--;
		}
		while(count > 1);
		return test;
	}
	private static Card[] sortByColor(Card[] lol)
	{
		for (int h=0; h< getQuantityColors(lol); h++)
		{
			if (lol[h].getNumber()==0) continue;
			if (duplicateByColor(h, lol)!=h) 
			{
				int x = duplicateByColor(h, lol);
				Card lol1 = lol[0];
				lol[0] = lol[h];
				lol[h] = lol1;
				lol1 = lol[1];
				lol[1] = lol[x];
				lol[x] = lol1;
			}
		}
		return lol;	
	}
	
	public static Card[] choiceSet(Card[] test) //kart odrzucone oznaczam przez temp[x] = 0 na polu warto��
	{
		Card[] temp = test;
		int quantityCards; // = 4;
		int quantityColors;
		int difference = 0;
		for (int i=0; i<=2; i++ ) // czwartej karty nie trzeba sprawdza�
		{
			quantityColors = getQuantityColors(temp);
			quantityCards = getQuantityCards(temp);
			difference = quantityCards - quantityColors;
			switch ( difference )
			{
				case 0:
				{
					if( isRepeat(i, temp) ) temp[i].setNumber(0);
					else if (i==2) return temp; //gdy trzecia karta z reki sie nie powtarza to zwroc reke
					break;
				}
				case 1:
				{
					temp = sortByColor(temp); //zwraca r�k� posortowana wg. color�w, na pocz�tku colory powtarzaj�ce si�
					int counter =0; //okresli ile kart si� paruje
					for (int j=0; j <= 1; j++) // przy opcji 2karty tego samego koloru, to sprawdz pierwsze dwie
					{
						if( isRepeat(j, temp) ) counter = counter + 1;
					}
					if ( counter == 0)
					{
						int result = temp[0].compareTo(temp[1]);
						if ( result == 1) temp[0].setNumber(0);
						else if ( result == -1) temp[1].setNumber(0);
						//warunku result == 0 nie sprawdzam bo nie moga byc dwie karty tego samego koloru i wartosci
					}
					else if ( counter == 1)
					{
						if ( isRepeat(0, temp) ) temp[0].setNumber(0);
						else if( isRepeat(1, temp) ) temp[1].setNumber(0);
					}
					else if ( counter == 2) /*mo�na od razu odrzuci� kart� kt�ra paruje si� z dubluj�cym kolorem*/
					{
						if ( temp[0].compareTo(temp[1]) == 1 )
						{
							temp[0].setNumber(0);
						}
						else temp[1].setNumber(0);
					}
					break;
				}
				case 2:
				{
					if ( quantityCards == 3 ) // zostaw najnizsza i zwroc reke
					{
						/*na wstepie jedna karta odrzucona (czyli 0 ), jak posortuje malejaco
						 * to najmniejsza b�dzie przedostatnia (indeks 2 w temp) i j� uchowam, reszte wyzeruje
						 */
						temp = sortBack(temp);
						for ( int x=0; x<temp.length; x++) 
						{
							if ( x == 2) continue;
							else temp[x].setNumber(0);
						}
						return temp;
					}
					else if ( quantityCards == 4 )
					{
						temp = sortBack(temp);
						temp[duplicateByColor(3, temp)].setNumber(0);
						return temp;
					}
					break;
				}
				case 3: //opcja mozliwa tylko przy 4kartach - tzn zadnej jeszcze nie odrzucilismy
				{
					temp = sortBack(temp); //zerujemy wszystkie procz najnizszej
					for ( int x=0; x<temp.length-1; x++) 
					{
						temp[x].setNumber(0);
					}
					break;
				}
			}
		}
		return temp;
	}
	public static int getQuantityColors (Card[] test)
	{
		int counter = 0;
		boolean isAdded = false;
		String[] colors = {"SPADE", "HEART", "DIAMOND", "CLUB"};
		for (int j=0; j<=3; j++)
		{
			for (int i=0; i <= 3; i++)
			{
				if ( colors[j].equals(test[i].getColor()) && (isAdded == false) )
				{
					if (test[i].getNumber()==0) continue;
					counter = counter +1;
					isAdded = true; // oznacza ze dla danego koloru policzylismy juz wystapienie tego koloru
				}
			}
			isAdded = false;
		}
		return counter;
	}
	public static int getQuantityCards(Card[] test)
	{
		int counter=0;
		for (int g=0; g<test.length; g++)
		{
			if(test[g].getNumber()>0) counter = counter +1; //0 - odrzucone karty
		}
		return counter;
	}
	private static boolean isRepeat(int index, Card[] cards)
	{
		boolean isReapeat = false;
		int value = cards[index].getNumber();
		for (int i=0; i < cards.length ; i++)
		{
			if ( i == index ) continue;
			if ( (cards[i].getNumber() != 0) && (value == cards[i].getNumber()) ) isReapeat = true; //ignoruje karty odrzucone
		}
		return isReapeat;
	}
	private static int duplicateByColor(int index, Card[] cards) 
	/* zwraca indeks karty ktora powtarza sie z podana w parametrach
	* Metoda dziala tylko dla karty ktora duplikuje sie kolorem z tylko jedna karta */
	{
		int whoDuplicate=index; 
		String myColor = cards[index].getColor();
		for (int y=0; y<cards.length; y++)
		{
			if ( y==index) continue;
			if ( (cards[y].getColor()).equals(myColor) ) whoDuplicate = y;
		}
		return whoDuplicate; // gdy zwroci index tzn ze nie bylo innej karty kolorem
	}
}

